Системное программирование

Использование диалоговых окон в Windows-приложениях

Системное программирование

Диалоговые окна — это специальные окна, которые используются для взаимодействия с пользователем. Они могут отображать информацию, запрашивать данные или предоставлять выбор опций. Диалоговые окна бывают двух типов: модальные и немодальные.

  • Модальные окна блокируют взаимодействие с родительским окном до тех пор, пока пользователь не закроет диалог.
  • Немодальные окна позволяют пользователю взаимодействовать как с диалогом, так и с родительским окном.
Организация  интерфейса  на основе меню
Системное программирование

1. Создание диалогового окна

Диалоговые окна создаются с помощью файла ресурсов (.rc) или программно в коде.

Организация  интерфейса  на основе меню
Системное программирование

1.1. Создание диалога в файле ресурсов

Пример создания диалогового окна в файле ресурсов:

// Файл ресурсов (app.rc)
IDD_DIALOG1 DIALOGEX 0, 0, 200, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Пример диалога"
FONT 8, "MS Sans Serif"
BEGIN
    DEFPUSHBUTTON "OK", IDOK, 10, 70, 50, 14
    PUSHBUTTON "Отмена", IDCANCEL, 70, 70, 50, 14
    LTEXT "Введите текст:", IDC_STATIC, 10, 10, 80, 10
    EDITTEXT IDC_EDIT1, 10, 25, 180, 14
END
Организация  интерфейса  на основе меню
Системное программирование

1.2. Создание диалога программно

Пример создания диалога в коде:

HWND hwndDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwndParent, DialogProc);
ShowWindow(hwndDlg, SW_SHOW);
Организация  интерфейса  на основе меню
Системное программирование

2. Обработка диалогового окна

Обработка диалогового окна выполняется в специальной процедуре диалога (DialogProc). Эта процедура обрабатывает сообщения, такие как нажатие кнопок или ввод текста.

Организация  интерфейса  на основе меню
Системное программирование

Пример процедуры диалога:

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_INITDIALOG:
            // Инициализация диалога
            return TRUE;
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                case IDOK: {
                    char text[100];
                    GetDlgItemText(hwndDlg, IDC_EDIT1, text, sizeof(text));
                    MessageBox(hwndDlg, text, "Введенный текст", MB_OK);
                    EndDialog(hwndDlg, IDOK);
                    return TRUE;
                }
                case IDCANCEL:
                    EndDialog(hwndDlg, IDCANCEL);
                    return TRUE;
            }
            break;
        case WM_CLOSE:
            EndDialog(hwndDlg, IDCANCEL);
            return TRUE;
    }
    return FALSE;
}
Организация  интерфейса  на основе меню
Системное программирование

3. Отображение модального диалога

Модальные диалоги блокируют взаимодействие с родительским окном до закрытия. Для отображения модального диалога используется функция DialogBox.

Пример:

DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwndParent, DialogProc);
Организация  интерфейса  на основе меню
Системное программирование

4. Отображение немодального диалога

Немодальные диалоги позволяют пользователю взаимодействовать с родительским окном. Для отображения немодального диалога используется функция CreateDialog.

Пример:

HWND hwndDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwndParent, DialogProc);
ShowWindow(hwndDlg, SW_SHOW);
Организация  интерфейса  на основе меню
Системное программирование

5. Работа с элементами управления

Диалоговые окна содержат элементы управления, такие как кнопки, текстовые поля, списки и т.д. Для работы с этими элементами используются функции API, такие как GetDlgItemText, SetDlgItemText, SendDlgItemMessage.

5.1. Получение текста из текстового поля

Пример:

char text[100];
GetDlgItemText(hwndDlg, IDC_EDIT1, text, sizeof(text));
Организация  интерфейса  на основе меню
Системное программирование

5.2. Установка текста в текстовое поле

Пример:

SetDlgItemText(hwndDlg, IDC_EDIT1, "Привет, мир!");

5.3. Работа с кнопками

Пример обработки нажатия кнопки:

case WM_COMMAND:
    if (LOWORD(wParam) == IDC_BUTTON1) {
        MessageBox(hwndDlg, "Кнопка нажата!", "Уведомление", MB_OK);
    }
    break;
Организация  интерфейса  на основе меню
Системное программирование

6. Пример программы с диалоговым окном

Рассмотрим пример программы, которая отображает модальное диалоговое окно с текстовым полем и кнопками.

Организация  интерфейса  на основе меню
Системное программирование

6.1. Файл ресурсов (app.rc)

IDD_DIALOG1 DIALOGEX 0, 0, 200, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Пример диалога"
FONT 8, "MS Sans Serif"
BEGIN
    DEFPUSHBUTTON "OK", IDOK, 10, 70, 50, 14
    PUSHBUTTON "Отмена", IDCANCEL, 70, 70, 50, 14
    LTEXT "Введите текст:", IDC_STATIC, 10, 10, 80, 10
    EDITTEXT IDC_EDIT1, 10, 25, 180, 14
END
Организация  интерфейса  на основе меню
Системное программирование

6.2. Код программы (main.c)

#include <windows.h>

#define IDC_EDIT1 101

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_INITDIALOG:
            return TRUE;
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                case IDOK: {
                    char text[100];
                    GetDlgItemText(hwndDlg, IDC_EDIT1, text, sizeof(text));
                    MessageBox(hwndDlg, text, "Введенный текст", MB_OK);
                    EndDialog(hwndDlg, IDOK);
                    return TRUE;
                }
                case IDCANCEL:
                    EndDialog(hwndDlg, IDCANCEL);
                    return TRUE;
            }
            break;
        case WM_CLOSE:
            EndDialog(hwndDlg, IDCANCEL);
            return TRUE;
    }
    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
    return 0;
}
Организация  интерфейса  на основе меню